datasets
1. Analysis by geography
1.1 Comparing beneficiaries reached and PIN by state and region

The PIN figures originated from the WFP township-level calculations for the FSC based on the combination of food insecure persons and IDPs.
Currently the beneficiaries reached by the Food Security Cluster far exceed the figures for People in Need established in 2021. 2,088,142 have been reached throughout the first three quarters of 2021; this is 71% of the cluster PIN; however, as we can see, the response has been heavily skewed towards Yangon and Rakhine.
1.2 Beneficiaries and PIN by state and region
Joining, by = “admin3_pcode”
Beneficiaries reached and PIN by state/region
| Yangon |
1,274,906 |
61.27 |
1,946,729 |
14.58 |
65.49 |
| Rakhine |
430,247 |
20.68 |
1,000,300 |
7.49 |
43.01 |
| Kachin |
87,452 |
4.2 |
565,037 |
4.23 |
15.48 |
| Mon |
43,442 |
2.09 |
479,600 |
3.59 |
9.06 |
| Kayah |
15,920 |
0.77 |
175,915 |
1.32 |
9.05 |
| Kayin |
46,932 |
2.26 |
521,733 |
3.91 |
9 |
| Shan (North) |
64,794 |
3.11 |
1,040,211 |
7.79 |
6.23 |
| Chin |
13,550 |
0.65 |
297,681 |
2.23 |
4.55 |
| Mandalay |
24,829 |
1.19 |
774,956 |
5.8 |
3.2 |
| Ayeyarwady |
55,276 |
2.66 |
1,873,441 |
14.03 |
2.95 |
| Shan (South) |
9,304 |
0.45 |
993,317 |
7.44 |
0.94 |
| Sagaing |
8,090 |
0.39 |
870,919 |
6.52 |
0.93 |
| Bago (East) |
4,312 |
0.21 |
729,561 |
5.46 |
0.59 |
| Magway |
1,695 |
0.08 |
855,823 |
6.41 |
0.2 |
| Bago (West) |
0 |
0 |
500,694 |
3.75 |
0 |
| Shan (East) |
0 |
0 |
367,238 |
2.75 |
0 |
| Tanintharyi |
0 |
0 |
362,733 |
2.72 |
0 |
| Nay Pyi Taw |
0 |
0 |
0 |
0 |
NA |
In general, there is large mismatch between a state’s share of beneficiaries and its share of the PIN – notably, Yangon constitutes 61% of all beneficiaries but only 15% of the nationwide PIN. Although Yangon has the highest share of people in need, it should also be stressed that the percentage of it’s population that is vulnerable – that is, either food insecure or internally displaced – is one of the lowest in the country, at 22%, with only Magway, Sagaing and Mandalay having lower percentages:

Vulnerability here has been defined as the proportion of the population who are
1.3 Township-level
Just as the response has been very skewed at the state and region level, the same is true at the township level. These 10 townships below are where 80% of all beneficiaries have been reached despite only constituting 15% of the PIN – in particular, Dagon Myothit (Seikkan) and Hlaingtharya have beneficiary figures that are 633% and 430% of their PIN respectively. For reference, the median percentage of people in need covered per township in the areas we work in is 7%.
Top 10 townships by beneficiaries reached
| Hlaingtharya |
772,658 |
37 |
179,313 |
3.52 |
430.9 |
5 |
| Dagon Myothit (Seikkan) |
276,430 |
13.24 |
43,650 |
0.86 |
633.3 |
2 |
| Dala |
170,463 |
8.16 |
45,060 |
0.88 |
378.3 |
3 |
| Sittwe |
147,864 |
7.08 |
128,717 |
2.53 |
114.9 |
9 |
| Buthidaung |
106,815 |
5.12 |
27,219 |
0.53 |
392.4 |
4 |
| Maungdaw |
80,348 |
3.85 |
16,889 |
0.33 |
475.7 |
6 |
| Pauktaw |
33,907 |
1.62 |
75,096 |
1.47 |
45.15 |
5 |
| Kawkareik |
30,867 |
1.48 |
70,417 |
1.38 |
43.83 |
2 |
| Lashio |
29,963 |
1.43 |
132,229 |
2.6 |
22.66 |
1 |
| Kyaikmaraw |
28,590 |
1.37 |
45,633 |
0.9 |
62.65 |
1 |
107 townships have been reached by food security activities in the first three-quarters of 2021. This is less than a third of the 330 townships in the country.
1.4 Locations
Partners have responded in a total of 1563across the country, with the vast majority of locations only having only one partner operating in them. Of the 5776 rows reported in the 5Ws, only 156 did not have any location reported.
Locations are classified into three groups – camps, industrial zones and villages/towns/wards:
Summary of location types
| village_ward_town |
1,157 |
90 |
1,422,282 |
81.42 |
1,229 |
| camp |
421 |
38 |
316,648 |
18.13 |
752 |
| industrial_zone |
5 |
2 |
7,870 |
0.45 |
1,574 |
The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location:

The more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-sector locations are comparatively rare:
summarise() has grouped output by ‘location’. You can override using the .groups argument.
| one_partner |
1,496 |
182 |
| two_partners |
61 |
676 |
| three_partners |
11 |
859 |
2. Activities and modalities
2.1 Progress by activity

Partners reported their achievements across 8 5W activities. It is interesting to note that almost all the beneficiaries monthly cash transfers were established very early on (or had been established prior to 2021), with new beneficiaries being added very incrementally throughout the year. This speaks to one of the difficulties of interpreting this data – that these patterns are more reflective of partners’ reporting behaviours rather than they are of changes in the field. For instance – was there truly a massive leap in techical training in September, or did a partner report all their achievements at once? Nevertheless, this section will explore the data as it exists to understand what meaningful analysis can be drawn from it.
2.1 Delivery modalilties

Cash is the preferred delivery modality for four out of the nine activities under the Food Security Cluster, followed by “in-kind”, which is the preferred modality in three. However, the in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets.
It must be noted, however, that a key piece of missing information not currently captured by the 5W template is the duration of these activities – the number of months a monthly food basket is provided cannot be reliably calculated from the data we currently have on hand. We also note several misclassifications – small portions of monthly cash transfers have been coded as in-kind and there are in-kind food baskets coded as hybrid. It might also be worth considering the distinction between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.
summarise() has grouped output by ‘delivery_modality’. You can override using the .groups argument.
Delivery modalities by frequency
| In-kind |
303,595 |
73,665 |
291,175 |
1,063,779 |
40,697 |
1,772,911 |
84.9 |
| Cash |
894 |
202,556 |
64,535 |
2,973 |
228 |
271,186 |
12.99 |
| Hybrid (In-kind & Cash) |
NA |
11,026 |
2,488 |
10,503 |
NA |
24,017 |
1.15 |
| Service delivery/support |
NA |
2,072 |
6,040 |
4,620 |
NA |
12,732 |
0.61 |
| Voucher |
NA |
NA |
2,519 |
4,777 |
NA |
7,296 |
0.35 |
| Total |
304,489 |
289,319 |
366,757 |
1,086,652 |
40,925 |
2,088,142 |
100 |
In-kind support was by far the most common delivery modality, with 85% of unique beneficiaries receiving support through that means. 13% of beneficiaries were reached by cash transfers. I believe the “other” frequency should be dropped as an option in the 5W template and replaced with more specific options as it is unclear if it refers to interventions that repeat more frequently than once a month or less. It might also be that partners are selecting “other” instead of leaving the field blank. It might be possible to backfill most the the “other” values from the beneficiaries_recurrency column – this will be explore further in the section on beneficiaries.
2.2 Value of intervention packages per household

We note that the most common transfer values – in terms of beneficiaries reached – are between USD 10 and USD 20, though it should be noted – and can be more clearly seen from the table below, a not insignifcant number of beneficiaries were reached by cash transfer interventions valued at more than USD 100 per household.
Cash transfer, hybrid and voucher values per household by frequency of transfer (USD)
| below_$10 |
185 |
30,682 |
2,126 |
9,543 |
42,536 |
14.82 |
| $10_$20 |
241 |
122,979 |
8,002 |
502 |
131,724 |
45.9 |
| $20_$40 |
242 |
11,335 |
13,756 |
1,881 |
27,214 |
9.48 |
| $40_$60 |
226 |
29,536 |
12,850 |
188 |
42,800 |
14.91 |
| $60_$100 |
NA |
9,826 |
4,850 |
4,912 |
19,588 |
6.83 |
| $100_$200 |
NA |
413 |
14,255 |
789 |
15,457 |
5.39 |
| above_$200 |
NA |
23 |
7,204 |
438 |
7,665 |
2.67 |
Next, let us take a look at household package values by activity type:

An avenue to explore here would be the provision of monthly cash transfers – this activity has a very clear peak at $10-$20. A closer look at the data reveals this almost entirely due 122,854 beneficiaries who received monthly transfers of USD 10.50 per household; it is unclear whether USD 10.50 per household would be sufficient to cover their monthly food needs – we should cross-reference this with the calculations for minimum expenditure baskets – but it certainly is doubtful. Perhaps this type of relatively low-value transfer should be reclassified as a supplementary intervention not meant to cover a household food security needs. 7 partners currently provide this type of monthly transfer – Save the Children, WFP, Myanmar Heart Organisation, People for People, Plan International, World Vision Myanmar and Karuna Mission Social Solidarity; we should follow up with them to understand if this sum (equivalent to MMK 15,000) is truly meant to cover monthly food expenditures.
The two peaks in “support for income-generating activities” ($10-$20 and above_$200) are an order of magnitude apart – it not inconceivable that they should be split into two separate activities.
Some partners have also reported the value of the food baskets they are distributed; however, these only represent a small fraction of the total (less than 1%, by beneficiaries) and it would be much more preferable to collect the actual contents of these food baskets for analysis than use the data in the 5Ws.
3. Partners
Partners fairly evenly split themselves between HRP indicators, with 29 contributing towards food and cash assistance and 28 contributing towards agriculture and other livelihood support. As a reference, 28 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 4,697. Below are the top 10 partners by HRP indicator.
Top 10 partners by beneficiaries reached, by HRP indicator
| Open Data Myanmar (ODM) |
304,919 |
|
Center for Social Integrity (CSI) |
28,725 |
| MRCS |
263,005 |
|
Action Contre la Faim |
19,109 |
| Zigway |
223,478 |
|
Action for Green Earth |
16,037 |
| Hlaingthayar Development Network |
189,701 |
|
World Vision Myanmar |
15,303 |
| World Vision Myanmar |
168,698 |
|
Myanmar Heart Development Organization |
9,867 |
| Urban Strength (US) |
128,878 |
|
WFP |
7,691 |
| WFP |
105,984 |
|
Save the Children |
7,543 |
| Hlaingthayar Youth Network |
96,145 |
|
Phyu Sin Saydanar Action Group |
6,052 |
| Action for Green Earth |
67,578 |
|
BRAC Myanmar |
5,162 |
| Myanmar Heart Development Organization |
63,838 |
|
MRCS |
5,051 |
Distribution of partners by beneficiaries and geographic reach
mouse over for details
Whilst there is quite a bit of variation in the number of beneficiaries reached, we can see that partners’ geographic footprints are – on the whole – quite limited. Only 4 out of 47 partners have a presence in more than 10 townships, with only 10 being present in more than 5. 79% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. If the response is truly meant to be countrywide, it is imperative to understand what would incentivise partners to expand their footprints.
Map of number of partners and people in need by state/region
There are 58 combinations between reporting organisations and implementing partners, 19 of which are instances where the reporting organisation and the implementing partner and the same organisation; once these 19 are filtered out, all the remaining implementing partners correspond to just 10 reporting organisations:
Number of implementing partners by reporting organisation
| WFP |
21 |
| Save the Children |
4 |
| FAO |
3 |
| Finn Church Aid |
3 |
| Mercy Corps |
2 |
| Trocaire |
2 |
| AVSI |
1 |
| Danish Refugee Council |
1 |
| Helvetas |
1 |
| Oxfam |
1 |
Beneficiaries by implmenting partner type
| INGO |
1,469,735 |
55 |
| NNGO |
2,779,172 |
60 |
| UN |
1,245,381 |
52 |

Beneficiaries
summarise() has grouped output by ‘state’. You can override using the .groups argument.
Percentage of beneficiaries by type, by state/region
| Ayeyarwady |
100 |
NA |
NA |
NA |
55,276 |
| Bago (East) |
NA |
100 |
NA |
NA |
4,312 |
| Chin |
9.225 |
90.77 |
NA |
NA |
13,550 |
| Kachin |
6.486 |
91.8 |
1.714 |
NA |
87,452 |
| Kayah |
45.89 |
54.11 |
NA |
NA |
15,920 |
| Kayin |
89.99 |
10.01 |
NA |
NA |
46,932 |
| Magway |
100 |
NA |
NA |
NA |
1,695 |
| Mandalay |
100 |
NA |
NA |
NA |
24,829 |
| Mon |
91.68 |
6.524 |
1.795 |
NA |
43,442 |
| Rakhine |
19.17 |
12.5 |
NA |
68.33 |
430,247 |
| Sagaing |
100 |
NA |
NA |
NA |
8,090 |
| Shan (East) |
100 |
NA |
NA |
NA |
510 |
| Shan (North) |
25.69 |
74.31 |
NA |
NA |
71,677 |
| Shan (South) |
100 |
NA |
NA |
NA |
9,304 |
| Yangon |
100 |
NA |
NA |
NA |
1,274,906 |
| Total |
75.27 |
10.54 |
0.1091 |
14.08 |
NA |
The states and sub-regions in which we are working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 75% of beneficiaries are from the host/local community, 14% are stateless persons from Rakhine and 11% are IDPs.

## # A tibble: 3 x 3
## # Groups: beneficiaries_recurrency [3]
## beneficiaries_recurrency frequency beneficiaries
## <chr> <chr> <dbl>
## 1 First Other 1044698
## 2 One-off Other 41974
## 3 Recurrent Other 367867


LS0tDQp0aXRsZTogIkluaXRpYWwgcmVwb3J0IG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgNVdzIg0KYXV0aG9yOiAiU2VhbiBOZyINCmRhdGU6ICIyNC8xMS8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICANCi0tLQ0KDQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShwbG90bHkpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCmZzY2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KIH0NCg0KYGBgDQoNCiMjIyBkYXRhc2V0cw0KDQpgYGB7ciBkYXRhc2V0cywgaW5jbHVkZT1GQUxTRX0NCg0KIyBpbmRpY2F0b3IgZ3VpZGUgZm9yIHZ1bG1tcg0KaW5kaWNhdG9yX2d1aWRlIDwtIHJlYWRfZXhjZWwoIkRhdGFzZXRzX1Z1bG5lcmFiaWxpdHlfQW5hbHlzaXNfaW5fTXlhbm1hcl8wOUp1bDIwMTggKDEpLnhsc3giLA0KICAgICAgICAgICBza2lwID0gMSkgJT4lIA0KICBzbGljZSgxOjMpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIHRyYW5zcG9zZV9kZigpICU+JSANCiAgcmVuYW1lKGluZGljYXRvciA9IHJvd25hbWUsIA0KICAgICAgICAgYWdlX2dyb3VwID0gYDFgLA0KICAgICAgICAgY2F0ZWdvcnkgPSBgMmAsIA0KICAgICAgICAgc291cmNlID0gYDNgKSAlPiUgDQogIHNsaWNlKC0xKQ0KDQojIHJlYWRpbmcgaW4gdnVsbmVyYWJpbGl0eSBkYXRhc2V0DQp2dWxtbXIgPC0gcmVhZF9leGNlbCgiRGF0YXNldHNfVnVsbmVyYWJpbGl0eV9BbmFseXNpc19pbl9NeWFubWFyXzA5SnVsMjAxOCAoMSkueGxzeCIsDQogICAgICAgICAgIHNraXAgPSAxKSAlPiUgDQogIHNsaWNlKC1jKDE6MykpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtbGFiZWwpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobnVtYmVyX29mX3ZpbGxhZ2VfdHJhY3RzOndiX3dlYWx0aF9yYW5rKSwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkaXNhc3RlcnNfaW1wYWN0ZWRfYnlfbmFyZ2lzXzIwMDg6YWNsZWRfMjAxNV8yMDE2X2RhdGFfZXhpc3RzKSwgYXMubG9naWNhbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjb25mbGljdF8yMDE1XzIwMTZfbnVtYmVyX29mX2JhdHRsZXM6Y29ycmVjdGVkX2NvbmZsaWN0X2luZGV4X2dhcnJ5KSwgYXMubnVtZXJpYykgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ4IikpICU+JSANCiAgc2VsZWN0KC1jKHByaXZhdGVfc2VjdG9yX2RldmVsb3BtZW50XzIwMTRfMjAxNSwgcHJvdGVjdGlvbl8yMDEwXzIwMTUsIHNoZWx0ZXJfMjAxMF8yMDE1LCB3YXNoXzIwMTBfMjAxNSkpIA0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9IDAsIGFkbWluM19wY29kZSA9IDAsIGFkbWluMV9wY29kZSA9IDApKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsMTlfKGluY2x1ZGVkIEFsbCBJUCBSZXBvcnRzKV9KYW4gdG8gU2VwIDIwMjFfSU0gQ29tYmluZWRfRmluYWwueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIikpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiICIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV9tbWsgPSB2YWx1ZV9wZXJfaG91c2Vob2xkICogaG91c2Vob2xkcykgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG15KG1vbnRoX29mX2ltcGxlbWVudGF0aW9uKSkgJT4lIA0KICBtdXRhdGUodV9iZW4gPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSkpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gY2FzZV93aGVuKHZhbHVlX3Blcl9ob3VzZWhvbGQgPCAxMDAwMCB+ICJiZWxvd18xMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDEwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAyMDAwMCB+ICIxMGtfMjBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDIwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA1MDAwMCB+ICIyMGtfNTBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDUwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA3MDAwMCB+ICI1MGtfNzBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDcwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwMCB+ICI3MGtfMTAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDIwMDAwMCB+ICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDIwMDAwMCAmIHZhbHVlX3Blcl9ob3VzZWhvbGQgPD0gMzAwMDAwIH4gIjIwMGtfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPiAzMDAwMDAgfiAiYWJvdmVfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIGMoImxlc3NfdGhhbl8xMGsiLCAiMTBrXzIwayIsIjIwa181MGsiLCAiNTBrXzcwayIsICI3MGtfMTAwayIsICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMGtfMzAwayIsIm1vcmVfdGhhbl8zMDBrIikpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVjb2RlKGZyZXF1ZW5jeSwgIm1vbnRobHkiID0gIk1vbnRobHkiKSkgJT4lDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMCB+ICJiZWxvd18kMTAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwIH4gIiQxMF8kMjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDQwIH4gIiQyMF8kNDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDYwIH4gIiQ0MF8kNjAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gNjAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDEwMCB+ICIkNjBfJDEwMCIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA+PSAxMDAgJiB2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA8IDIwMCB+ICIkMTAwXyQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMjAwIH4gImFib3ZlXyQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiYmVsb3dfJDEwIiwgIiQxMF8kMjAiLCAiJDIwXyQ0MCIsICIkNDBfJDYwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkNjBfJDEwMCIsICIkMTAwXyQyMDAiLCAiYWJvdmVfJDIwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiLA0KICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0LCBjb250cmlidXRpbmcgdG8gaG91c2Vob2xkIGZvb2Qgc2VjdXJpdHkiID0NCiAgICAgICAgICAgICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkNCiAgDQoNCiMgYmVuIGRhdGFzZXQgLS0gdGlkeSBmcm9tYXQgNVdzIGZvciBiZW5lZmljaWFyaWVzIA0KYmVuIDwtIGZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lICANCiAgc2VsZWN0KGRhdGUsDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsDQogICAgICAgICBzdGF0ZSwgdG93bnNoaXAsIHZpbGxhZ2Vfd2FyZF90b3duLCBsb2NhdGlvbiwgbG9jYXRpb25fdHlwZSwgYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUsDQogICAgICAgICBhY3Rpdml0eSwgYWN0aXZpdHlfc3RhdHVzLCBocnBfaW5kaWNhdG9yLCBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGNoaWxkX21hbGUsIGNoaWxkX2ZlbWFsZSwgYWR1bHRfbWFsZSwgYWR1bHRfZmVtYWxlLCBlbGRlcmx5X21hbGUsIGVsZGVybHlfZmVtYWxlKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY2hpbGRfbWFsZTplbGRlcmx5X2ZlbWFsZSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkaXNhZ2dyZWdhdGlvbiIsIHZhbHVlc190byA9ICJiZW5lZmljaWFyaWVzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQ0KIA0KDQojIHJlYWRpbmcgaW4gcGluIGFuZCB0YXJnZXRzDQpwaW4gPC0gcmVhZF9leGNlbCgiUElOIGNhbGN1bGF0aW9uIEZvb2QgU2VjdXJpdHkgQ2x1c3Rlcl9Ub3duc2hpcCBCcmVha2Rvd24ueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkZvb2QgU2VjIFBpTiB3aXRoIElEUHMiLCANCiAgICAgICAgICAgc2tpcCA9IDIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtYyh4MTUsIHgxNiwgeDE3LCB4MTgpKSAlPiUgDQogIHNsaWNlKDE6MzQ2KSAlPiUgDQogIGZpbGwocmVnaW9uKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwNCiAgICAgICAgIGlkcHMgPSBpZF9wcywgDQogICAgICAgICBwb3BfbWludXNfaWRwcyA9IHBvcHVsYXRpb25fbWludXNfaWRfcHMsIA0KICAgICAgICAgdG90YWxfcGluID0gdnVsbmVyYWJsZV9mb29kX2luc2VjdXJlX3Blb3BsZV9pZF9wcykgJT4lICANCiAgZmlsdGVyKHRvd25zaGlwICE9ICJUb3RhbCIpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKHBvcF9taW51c19pZHBzOm1vZGVyYXRlbHlfc2V2ZXJlbHkpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcywgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICAlPiUgDQogIHNlbGVjdCgtc3RhdGUpICU+JSAgDQogIHJlbG9jYXRlKGFkbWluM19wY29kZSkgJT4lIHJlbG9jYXRlKHN0YXRlID0gc3RhdGVfbmFtZSkgJT4lIHJlbG9jYXRlKGFkbWluMV9wY29kZSkgJT4lIA0KICBtdXRhdGUocGNfdnVsID0gdG90YWxfcGluIC8gdG90YWxfcG9wLA0KICAgICAgICAgdG90YWxfcGluID0gcm91bmQodG90YWxfcGluLCBkaWdpdHMgPSAwKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKQ0KDQojIGZvciByZWxldmVsbGluZyAtLSB0aGlzIGlzIGluIG9yZGVyIG9mIGJlbmVmaWNpYXJpZXMNCnNyX29yZCA8LSBjKCJZYW5nb24iLCAiUmFraGluZSIsIkthY2hpbiIsICJBeWV5YXJ3YWR5IiwgIktheWluIiwgIA0KICAiTW9uIiwgIk1hbmRhbGF5IiwgIktheWFoIiwgIkNoaW4iLCAiU2FnYWluZyIsICJNYWd3YXkiLCANCiAgIkJhZ28iLCAiTmF5IFB5aSBUYXciLCAiU2hhbiIsICJUYW5pbnRoYXJ5aSIpDQpgYGANCg0KDQojIyAxLiBBbmFseXNpcyBieSBnZW9ncmFwaHkNCg0KIyMjIDEuMSBDb21wYXJpbmcgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbiANCg0KYGBge3J9DQoNCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0b3RhbF9waW4gPSBzdW0odG90YWxfcGluKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoLXN0YXRlLCBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVsZXZlbChzdGF0ZSwgc3Jfb3JkKSwgeSA9IHZhbHVlLCBmaWxsID0gdHlwZSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAwMDAwLCBieSA9IDIwMDAwMCksIGxhYmVscyA9IGNvbW1hKQ0KDQogIA0KYGBgDQoNClRoZSBQSU4gZmlndXJlcyBvcmlnaW5hdGVkIGZyb20gdGhlIFdGUCB0b3duc2hpcC1sZXZlbCBjYWxjdWxhdGlvbnMgZm9yIHRoZSBGU0MgYmFzZWQgb24gdGhlIGNvbWJpbmF0aW9uIG9mIGZvb2QgaW5zZWN1cmUgcGVyc29ucyBhbmQgSURQcy4gDQoNCg0KPiBDdXJyZW50bHkgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGZhciBleGNlZWQgdGhlIGZpZ3VyZXMgZm9yIFBlb3BsZSBpbiBOZWVkIGVzdGFibGlzaGVkIGluIDIwMjEuIDIsMDg4LDE0MiBoYXZlIGJlZW4gcmVhY2hlZCB0aHJvdWdob3V0IHRoZSBmaXJzdCB0aHJlZSBxdWFydGVycyBvZiAyMDIxOyB0aGlzIGlzIDcxJSBvZiB0aGUgY2x1c3RlciBQSU47IGhvd2V2ZXIsIGFzIHdlIGNhbiBzZWUsIHRoZSByZXNwb25zZSBoYXMgYmVlbiBoZWF2aWx5IHNrZXdlZCB0b3dhcmRzIFlhbmdvbiBhbmQgUmFraGluZS4gDQoNCg0KIyMjIDEuMiBCZW5lZmljaWFyaWVzIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbiANCg0KYGBge3J9DQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgUElOID0gc3VtKHRvdGFsX3BpbikpICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX1BJTmAgPSByb3VuZChQSU4gLyBzdW0oUElOKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJV9QSU5fcmVhY2hlZGAgPSBpZmVsc2UoaXMuaW5maW5pdGUoYmVuZWZpY2lhcmllcyAvIFBJTiAqIDEwMCksIE5BX3JlYWxfLCBiZW5lZmljaWFyaWVzIC8gUElOICogMTAwKSwNCiAgICAgICAgIGAlX1BJTl9yZWFjaGVkYCA9IHJvdW5kKGAlX1BJTl9yZWFjaGVkYCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYXJyYW5nZShkZXNjKGAlX1BJTl9yZWFjaGVkYCkpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCBQSU4gYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNCkluIGdlbmVyYWwsIHRoZXJlIGlzIGxhcmdlIG1pc21hdGNoIGJldHdlZW4gYSBzdGF0ZSdzIHNoYXJlIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGl0cyBzaGFyZSBvZiB0aGUgUElOIC0tIG5vdGFibHksIFlhbmdvbiBjb25zdGl0dXRlcyA2MSUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgYnV0IG9ubHkgMTUlIG9mIHRoZSBuYXRpb253aWRlIFBJTi4gQWx0aG91Z2ggWWFuZ29uIGhhcyB0aGUgaGlnaGVzdCBzaGFyZSBvZiBwZW9wbGUgaW4gbmVlZCwgaXQgc2hvdWxkIGFsc28gYmUgc3RyZXNzZWQgdGhhdCB0aGUgcGVyY2VudGFnZSBvZiBpdCdzIHBvcHVsYXRpb24gdGhhdCBpcyB2dWxuZXJhYmxlIC0tIHRoYXQgaXMsIGVpdGhlciBmb29kIGluc2VjdXJlIG9yIGludGVybmFsbHkgZGlzcGxhY2VkIC0tIGlzIG9uZSBvZiB0aGUgbG93ZXN0IGluIHRoZSBjb3VudHJ5LCBhdCAyMiUsIHdpdGggb25seSBNYWd3YXksIFNhZ2FpbmcgYW5kIE1hbmRhbGF5IGhhdmluZyBsb3dlciBwZXJjZW50YWdlczogDQoNCmBgYHtyfQ0KcGluICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgZmlsdGVyKHN0YXRlICE9ICJOYXkgUHlpIFRhdyIpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BpbiA9IHJvdW5kKHN1bSh0b3RhbF9waW4pKSwNCiAgICAgICAgICAgIHRvdGFsX3BvcCA9IHN1bSh0b3RhbF9wb3ApKSAlPiUgDQogIG11dGF0ZShgdnVsbmVyYWJsZSVgID0gcm91bmQodG90YWxfcGluIC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgLWB2dWxuZXJhYmxlJWApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHRvdGFsX3BpbiwgZmlsbCA9IGB2dWxuZXJhYmxlJWApKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYHZ1bG5lcmFibGUlYCksIHNpemUgPSAyLjUsIHZqdXN0ID0gLTAuNSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDcwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAwLjYpKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkIiwgDQogICAgICAgdGl0bGUgPSAiUElOIGFuZCBpbmNpZGVuY2Ugb2YgdnVsbmVyYWJpbHR5IGJ5IHN0YXRlIGFuZCByZWdpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIlZ1bG5lcmFiaWxpdHkgaXMgZGVmaW5lZCBoZXJlIGFzIHRoZSBwcm9wb3J0aW9uIG9mIGEgcG9wdWxhdGlvbiB3aG8gYXJlIGZvb2QgaW5zZWN1cmUgb3IgYXJlIElEUHMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHJhbnMgPSAicmV2ZXJzZSIpDQpgYGANCg0KVnVsbmVyYWJpbGl0eSBoZXJlIGhhcyBiZWVuIGRlZmluZWQgYXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSANCg0KIyMjIDEuMyBUb3duc2hpcC1sZXZlbA0KDQpKdXN0IGFzIHRoZSByZXNwb25zZSBoYXMgYmVlbiB2ZXJ5IHNrZXdlZCBhdCB0aGUgc3RhdGUgYW5kIHJlZ2lvbiBsZXZlbCwgdGhlIHNhbWUgaXMgdHJ1ZSBhdCB0aGUgdG93bnNoaXAgbGV2ZWwuIFRoZXNlIDEwIHRvd25zaGlwcyBiZWxvdyBhcmUgd2hlcmUgODAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiByZWFjaGVkIGRlc3BpdGUgb25seSBjb25zdGl0dXRpbmcgMTUlIG9mIHRoZSBQSU4gLS0gaW4gcGFydGljdWxhciwgRGFnb24gTXlvdGhpdCAoU2Vpa2thbikgYW5kIEhsYWluZ3RoYXJ5YSBoYXZlIGJlbmVmaWNpYXJ5IGZpZ3VyZXMgdGhhdCBhcmUgNjMzJSBhbmQgNDMwJSBvZiB0aGVpciBQSU4gcmVzcGVjdGl2ZWx5LiBGb3IgcmVmZXJlbmNlLCB0aGUgbWVkaWFuIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIGluIG5lZWQgY292ZXJlZCBwZXIgdG93bnNoaXAgaW4gdGhlIGFyZWFzIHdlIHdvcmsgaW4gaXMgNyUuICANCg0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KHRvd25zaGlwKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGxlZnRfam9pbihwaW4gJT4lIHNlbGVjdCh0b3duc2hpcCwgcGluID0gdG90YWxfcGluKSwgYnkgPSAidG93bnNoaXAiKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgcGNfb2ZfcGluID0gcm91bmQocGluIC8gc3VtKHBpbiwgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHBpbiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUocGNfb2ZfdG90YWwsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUocGFydG5lcnMsIC5hZnRlciA9IHBjX3JlYWNoZWQpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjX29mX3RvdGFsKSkgJT4lIA0KICBoZWFkKDEwKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIikNCg0KIA0KYGBgDQoNCmByIGJlbiAlPiUgc2VsZWN0KHRvd25zaGlwKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgZm9vZCBzZWN1cml0eSBhY3Rpdml0aWVzIGluIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxLiBUaGlzIGlzIGxlc3MgdGhhbiBhIHRoaXJkIG9mIHRoZSAzMzAgdG93bnNoaXBzIGluIHRoZSBjb3VudHJ5LiANCg0KIyMjIDEuNCBMb2NhdGlvbnMNCg0KUGFydG5lcnMgaGF2ZSByZXNwb25kZWQgaW4gYSB0b3RhbCBvZiBgciBiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWBhY3Jvc3MgdGhlIGNvdW50cnksIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIG9ubHkgaGF2aW5nIG9ubHkgb25lIHBhcnRuZXIgb3BlcmF0aW5nIGluIHRoZW0uIE9mIHRoZSBgciBmc2MgJT4lIG5yb3coKWAgcm93cyByZXBvcnRlZCBpbiB0aGUgNVdzLCBvbmx5IGByIHN1bShpcy5uYShmc2MkbG9jYXRpb24pKWAgZGlkIG5vdCBoYXZlIGFueSBsb2NhdGlvbiByZXBvcnRlZC4gDQoNCkxvY2F0aW9ucyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIGdyb3VwcyAtLSBjYW1wcywgaW5kdXN0cmlhbCB6b25lcyBhbmQgdmlsbGFnZXMvdG93bnMvd2FyZHM6IA0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBhdmdfYmVuX3Blcl9sb2MgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gbG9jYXRpb25zLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiU3VtbWFyeSBvZiBsb2NhdGlvbiB0eXBlcyIpDQpgYGANCg0KVGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIGFyZSBzZXJ2ZWQgYnkgb25seSBvbmUgcGFydG5lci4gQmVsb3cgYXJlIGEgc2VyaWVzIG9mIGhpc3RvZ3JhbXMgc2hvd2luZyB0aGUgdmFyaWF0aW9uIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBieSBsb2NhdGlvbiwgc3BsaXQgYnkgbnVtYmVyIG9mIHBhcnRuZXJzIGluIGVhY2ggbG9jYXRpb246DQoNCmBgYHtyfQ0KDQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwYXJ0bmVycykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgc2NhbGVfeF9sb2cxMCgpICsNCiAgZmFjZXRfd3JhcCh+IHBhcnRuZXJzKSArDQogIGxhYnMoeSA9ICJudW1iZXIgb2YgbG9jYXRpb25zIiwNCiAgICAgICB4ID0gImJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtcyBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyBwZXIgbG9jYXRpb24iKQ0KDQpgYGANCg0KVGhlIG1vcmUgcGFydG5lcnMgb3BlcmF0aW5nIGluIGEgZ2l2ZW4gbG9jYXRpb24sIHRoZSBoaWdoZXIgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXM7IGhvd2V2ZXIsIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXNlIG11bHRpLXNlY3RvciBsb2NhdGlvbnMgYXJlIGNvbXBhcmF0aXZlbHkgcmFyZToNCg0KYGBge3J9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBzdW0obl9kaXN0aW5jdChsb2NhdGlvbikpLA0KICAgICAgICAgICAgYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWRpYW4oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIGAxYCA9ICJvbmVfcGFydG5lciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAidHdvX3BhcnRuZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJ0aHJlZV9wYXJ0bmVycyIpKSAlPiUgDQogcGFuZGVyKCkNCg0KYGBgDQoNCiMjIDIuIEFjdGl2aXRpZXMgYW5kIG1vZGFsaXRpZXMNCg0KIyMjIDIuMSBQcm9ncmVzcyBieSBhY3Rpdml0eQ0KDQpgYGB7cn0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgbXV0YXRlKGFjdGl2aXR5ID0gc3Vic3RyKGFjdGl2aXR5LCAwLCA1NSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGFjdGl2aXR5KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJjdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAyMDIxIFExLVEzIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KYGBgDQoNClBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGFjaGlldmVtZW50cyBhY3Jvc3MgOCA1VyBhY3Rpdml0aWVzLiBJdCBpcyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQgYWxtb3N0IGFsbCB0aGUgYmVuZWZpY2lhcmllcyBtb250aGx5IGNhc2ggdHJhbnNmZXJzIHdlcmUgZXN0YWJsaXNoZWQgdmVyeSBlYXJseSBvbiAob3IgaGFkIGJlZW4gZXN0YWJsaXNoZWQgcHJpb3IgdG8gMjAyMSksIHdpdGggbmV3IGJlbmVmaWNpYXJpZXMgYmVpbmcgYWRkZWQgdmVyeSBpbmNyZW1lbnRhbGx5IHRocm91Z2hvdXQgdGhlIHllYXIuIFRoaXMgc3BlYWtzIHRvIG9uZSBvZiB0aGUgZGlmZmljdWx0aWVzIG9mIGludGVycHJldGluZyB0aGlzIGRhdGEgLS0gdGhhdCB0aGVzZSBwYXR0ZXJucyBhcmUgbW9yZSByZWZsZWN0aXZlIG9mIHBhcnRuZXJzJyByZXBvcnRpbmcgYmVoYXZpb3VycyByYXRoZXIgdGhhbiB0aGV5IGFyZSBvZiBjaGFuZ2VzIGluIHRoZSBmaWVsZC4gRm9yIGluc3RhbmNlIC0tIHdhcyB0aGVyZSB0cnVseSBhIG1hc3NpdmUgbGVhcCBpbiB0ZWNoaWNhbCB0cmFpbmluZyBpbiBTZXB0ZW1iZXIsIG9yIGRpZCBhIHBhcnRuZXIgcmVwb3J0IGFsbCB0aGVpciBhY2hpZXZlbWVudHMgYXQgb25jZT8gTmV2ZXJ0aGVsZXNzLCB0aGlzIHNlY3Rpb24gd2lsbCBleHBsb3JlIHRoZSBkYXRhIGFzIGl0IGV4aXN0cyB0byB1bmRlcnN0YW5kIHdoYXQgbWVhbmluZ2Z1bCBhbmFseXNpcyBjYW4gYmUgZHJhd24gZnJvbSBpdC4gDQoNCiMjIyAyLjEgRGVsaXZlcnkgbW9kYWxpbHRpZXMgDQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShkZWxpdmVyeV9tb2RhbGl0eSwgYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdWJzdHIoYWN0aXZpdHksIDAsIDcyKSwNCiAgICAgICAgIGRlbGl2ZXJ5X21vZGFsaXR5ID0gcmVjb2RlKGRlbGl2ZXJ5X21vZGFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIgPSAiSHlicmlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIGRlbGl2ZXJ5L3N1cHBvcnQiID0gIlNlcnZpY2VzL3N1cHBvcnQiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjUpKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWVfeSIpDQogIA0KYGBgDQoNCkNhc2ggaXMgdGhlIHByZWZlcnJlZCBkZWxpdmVyeSBtb2RhbGl0eSBmb3IgZm91ciBvdXQgb2YgdGhlIG5pbmUgYWN0aXZpdGllcyB1bmRlciB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBmb2xsb3dlZCBieSAiaW4ta2luZCIsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgbW9kYWxpdHkgaW4gdGhyZWUuIEhvd2V2ZXIsIHRoZSBpbi1raW5kIG1vZGFsaXR5IGhhcyB0aGUgaGlnaGVzdCByZWFjaCwgZ2l2ZW4gdGhlIGVzcGVjaWFsbHkgbGFyZ2UgYmVuZWZpY2lhcnkgbnVtYmVycyBvcmlnaW5hdGluZyBmcm9tIHRoZSBwcm92aXNpb24gb2YgbW9udGhseSBmb29kIGJhc2tldHMuIA0KDQpJdCBtdXN0IGJlIG5vdGVkLCBob3dldmVyLCB0aGF0IGEga2V5IHBpZWNlIG9mIG1pc3NpbmcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBjYXB0dXJlZCBieSB0aGUgNVcgdGVtcGxhdGUgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZXNlIGFjdGl2aXRpZXMgLS0gdGhlIG51bWJlciBvZiBtb250aHMgYSBtb250aGx5IGZvb2QgYmFza2V0IGlzIHByb3ZpZGVkIGNhbm5vdCBiZSByZWxpYWJseSBjYWxjdWxhdGVkIGZyb20gdGhlIGRhdGEgd2UgY3VycmVudGx5IGhhdmUgb24gaGFuZC4gV2UgYWxzbyBub3RlIHNldmVyYWwgbWlzY2xhc3NpZmljYXRpb25zIC0tIHNtYWxsIHBvcnRpb25zIG9mIG1vbnRobHkgY2FzaCB0cmFuc2ZlcnMgaGF2ZSBiZWVuIGNvZGVkIGFzIGluLWtpbmQgYW5kIHRoZXJlIGFyZSBpbi1raW5kIGZvb2QgYmFza2V0cyBjb2RlZCBhcyBoeWJyaWQuIEl0IG1pZ2h0IGFsc28gYmUgd29ydGggY29uc2lkZXJpbmcgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gInN1cHBvcnQgZm9yIGluY29tZS1nZW5lcmF0aW5nIGFjdGl2aXRpZXMiIGFuZCB0aGUgInByb3Zpc2lvbiBvZiB0ZWNobmljYWwgdHJhaW5pbmciIGFzIHNlcnZpY2UgZGVsaXZlcnkgYW5kIHN1cHBvcnQgYXJlIGhlYXZpbHkgcHJlc2VudCBpbiBib3RoLiANCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoZGVsaXZlcnlfbW9kYWxpdHksIGZyZXF1ZW5jeSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGZyZXF1ZW5jeSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwY19vZl9Ub3RhbCA9IHJvdW5kKFRvdGFsIC8gMjA4ODE0MiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKFRvdGFsKSkgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGZyZXF1ZW5jeSIpDQoNCmBgYA0KDQpJbi1raW5kIHN1cHBvcnQgd2FzIGJ5IGZhciB0aGUgbW9zdCBjb21tb24gZGVsaXZlcnkgbW9kYWxpdHksIHdpdGggODUlIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlY2VpdmluZyBzdXBwb3J0IHRocm91Z2ggdGhhdCBtZWFucy4gMTMlIG9mIGJlbmVmaWNpYXJpZXMgd2VyZSByZWFjaGVkIGJ5IGNhc2ggdHJhbnNmZXJzLiBJIGJlbGlldmUgdGhlICJvdGhlciIgZnJlcXVlbmN5IHNob3VsZCBiZSBkcm9wcGVkIGFzIGFuIG9wdGlvbiBpbiB0aGUgNVcgdGVtcGxhdGUgYW5kIHJlcGxhY2VkIHdpdGggbW9yZSBzcGVjaWZpYyBvcHRpb25zIGFzIGl0IGlzIHVuY2xlYXIgaWYgaXQgcmVmZXJzIHRvIGludGVydmVudGlvbnMgdGhhdCByZXBlYXQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBhIG1vbnRoIG9yIGxlc3MuIEl0IG1pZ2h0IGFsc28gYmUgdGhhdCBwYXJ0bmVycyBhcmUgc2VsZWN0aW5nICJvdGhlciIgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBmaWVsZCBibGFuay4gSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gYmFja2ZpbGwgbW9zdCB0aGUgdGhlICJvdGhlciIgdmFsdWVzIGZyb20gdGhlIGBiZW5lZmljaWFyaWVzX3JlY3VycmVuY3lgIGNvbHVtbiAtLSB0aGlzIHdpbGwgYmUgZXhwbG9yZSBmdXJ0aGVyIGluIHRoZSBzZWN0aW9uIG9uIGJlbmVmaWNpYXJpZXMuIA0KDQojIyMgMi4yIFZhbHVlIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkIA0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbikgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgbGFicyh4ID0gIlVTRCB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQiLA0KICAgICAgIHkgPSAiQmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcGVyIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgdmFsdWUgcGVyIGhvdXNlaG9sZCIpDQpgYGANCg0KV2Ugbm90ZSB0aGF0IHRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSBiZXR3ZWVuIFVTRCAxMCBhbmQgVVNEIDIwLCB0aG91Z2ggaXQgc2hvdWxkIGJlIG5vdGVkIC0tIGFuZCBjYW4gYmUgbW9yZSBjbGVhcmx5IHNlZW4gZnJvbSB0aGUgdGFibGUgYmVsb3csIGEgbm90IGluc2lnbmlmY2FudCBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBtb3JlIHRoYW4gVVNEIDEwMCBwZXIgaG91c2Vob2xkLiANCg0KYGBge3J9DQpmc2MgJT4lICANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lIA0KICBjb3VudCh1c2RfaGhkX2JpbixmcmVxdWVuY3ksIHd0ID0gYmVuZWZpY2lhcmllcykgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gbikgJT4lIA0KICByZW5hbWUodHJhbnNmZXJfdmFsdWUgPSB1c2RfaGhkX2JpbikgJT4lDQogIHJlbG9jYXRlKEZpcnN0LCAuYWZ0ZXIgPSB0cmFuc2Zlcl92YWx1ZSkgJT4lIA0KICBzZWxlY3QoLWBOQWApICU+JSANCiAgYWRvcm5fdG90YWxzKCJjb2wiLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHBjX29mX1RvdGFsID0gcm91bmQoVG90YWwgLyBzdW0oVG90YWwpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJDYXNoIHRyYW5zZmVyLCBoeWJyaWQgYW5kIHZvdWNoZXIgdmFsdWVzIHBlciBob3VzZWhvbGQgYnkgZnJlcXVlbmN5IG9mIHRyYW5zZmVyIChVU0QpIikgICANCmBgYA0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdWJzdHIoYWN0aXZpdHksIDAsIDcyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgbGFicyh0aXRsZSA9ICJWYXJpYXRpb24gaW4gdGhlICBwZXIgaG91c2Vob2xkIHZhbHVlcyBvZiBpbnRlcnZlbnRpb24gcGFja2FnZXMgaW4gVVNEIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikNCg0KYGBgDQoNCkFuIGF2ZW51ZSB0byBleHBsb3JlIGhlcmUgd291bGQgYmUgdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGNhc2ggdHJhbnNmZXJzIC0tIHRoaXMgYWN0aXZpdHkgaGFzIGEgdmVyeSBjbGVhciBwZWFrIGF0IGAkMTAtJDIwYC4gQSBjbG9zZXIgbG9vayBhdCB0aGUgZGF0YSByZXZlYWxzIHRoaXMgYWxtb3N0IGVudGlyZWx5IGR1ZSAxMjIsODU0IGJlbmVmaWNpYXJpZXMgd2hvIHJlY2VpdmVkIG1vbnRobHkgdHJhbnNmZXJzIG9mIFVTRCAxMC41MCBwZXIgaG91c2Vob2xkOyBpdCBpcyB1bmNsZWFyIHdoZXRoZXIgVVNEIDEwLjUwIHBlciBob3VzZWhvbGQgd291bGQgYmUgc3VmZmljaWVudCB0byBjb3ZlciB0aGVpciBtb250aGx5IGZvb2QgbmVlZHMgLS0gd2Ugc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGlzIHdpdGggdGhlIGNhbGN1bGF0aW9ucyBmb3IgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXRzIC0tIGJ1dCBpdCBjZXJ0YWlubHkgaXMgZG91YnRmdWwuIFBlcmhhcHMgdGhpcyB0eXBlIG9mIHJlbGF0aXZlbHkgbG93LXZhbHVlIHRyYW5zZmVyIHNob3VsZCBiZSByZWNsYXNzaWZpZWQgYXMgYSBzdXBwbGVtZW50YXJ5IGludGVydmVudGlvbiBub3QgbWVhbnQgdG8gY292ZXIgYSBob3VzZWhvbGQgZm9vZCBzZWN1cml0eSBuZWVkcy4gNyBwYXJ0bmVycyBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIHR5cGUgb2YgbW9udGhseSB0cmFuc2ZlciAtLSBTYXZlIHRoZSBDaGlsZHJlbiwgV0ZQLCBNeWFubWFyIEhlYXJ0IE9yZ2FuaXNhdGlvbiwgUGVvcGxlIGZvciBQZW9wbGUsIFBsYW4gSW50ZXJuYXRpb25hbCwgV29ybGQgVmlzaW9uIE15YW5tYXIgYW5kIEthcnVuYSBNaXNzaW9uIFNvY2lhbCBTb2xpZGFyaXR5OyB3ZSBzaG91bGQgZm9sbG93IHVwIHdpdGggdGhlbSB0byB1bmRlcnN0YW5kIGlmIHRoaXMgc3VtIChlcXVpdmFsZW50IHRvIE1NSyAxNSwwMDApIGlzIHRydWx5IG1lYW50IHRvIGNvdmVyIG1vbnRobHkgZm9vZCBleHBlbmRpdHVyZXMuIA0KDQpUaGUgdHdvIHBlYWtzIGluICJzdXBwb3J0IGZvciBpbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIiAoYCQxMC0kMjBgIGFuZCBgYWJvdmVfJDIwMGApIGFyZSBhbiBvcmRlciBvZiBtYWduaXR1ZGUgYXBhcnQgLS0gaXQgbm90IGluY29uY2VpdmFibGUgdGhhdCB0aGV5IHNob3VsZCBiZSBzcGxpdCBpbnRvIHR3byBzZXBhcmF0ZSBhY3Rpdml0aWVzLiANCg0KU29tZSBwYXJ0bmVycyBoYXZlIGFsc28gcmVwb3J0ZWQgdGhlIHZhbHVlIG9mIHRoZSBmb29kIGJhc2tldHMgdGhleSBhcmUgZGlzdHJpYnV0ZWQ7IGhvd2V2ZXIsIHRoZXNlIG9ubHkgcmVwcmVzZW50IGEgc21hbGwgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIChsZXNzIHRoYW4gMSUsIGJ5IGJlbmVmaWNpYXJpZXMpIGFuZCBpdCB3b3VsZCBiZSBtdWNoIG1vcmUgcHJlZmVyYWJsZSB0byBjb2xsZWN0IHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlc2UgZm9vZCBiYXNrZXRzIGZvciBhbmFseXNpcyB0aGFuIHVzZSB0aGUgZGF0YSBpbiB0aGUgNVdzLiANCg0KDQojIyAzLiBQYXJ0bmVycw0KDQpQYXJ0bmVycyBmYWlybHkgZXZlbmx5IHNwbGl0IHRoZW1zZWx2ZXMgYmV0d2VlbiBIUlAgaW5kaWNhdG9ycywgd2l0aCAyOSBjb250cmlidXRpbmcgdG93YXJkcyBmb29kIGFuZCBjYXNoIGFzc2lzdGFuY2UgYW5kIDI4IGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIEFzIGEgcmVmZXJlbmNlLCAyOCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIDQsNjk3LiBCZWxvdyBhcmUgdGhlIHRvcCAxMCBwYXJ0bmVycyBieSBIUlAgaW5kaWNhdG9yLiANCg0KYGBge3J9DQoNCmNiaW5kKA0KICANCiAgYmVuICU+JSANCiAgICBmaWx0ZXIoaHJwX2luZGljYXRvciA9PSAiMS4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IgMWAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKSwNCiAgDQogIGJlbiAlPiUgDQogICAgZmlsdGVyKGhycF9pbmRpY2F0b3IgPT0gIjIuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQiKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDIuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnRgID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgYFBhcnRuZXJzIEhSUCBpbmRpY2F0b3IgMmAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKQ0KICANCikgJT4lIA0KICBhZGRfY29sdW1uKGAgYCA9ICIgIikgJT4lIA0KICByZWxvY2F0ZShgIGAsIC5hZnRlciA9IGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IEhSUCBpbmRpY2F0b3IiKQ0KDQpgYGANCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIGFuZCBnZW9ncmFwaGljIHJlYWNoIA0KX21vdXNlIG92ZXIgZm9yIGRldGFpbHNfDQoNCldoaWxzdCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIHdlIGNhbiBzZWUgdGhhdCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSAtLSBvbiB0aGUgd2hvbGUgLS0gcXVpdGUgbGltaXRlZC4gT25seSA0IG91dCBvZiA0NyBwYXJ0bmVycyBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDEwIHRvd25zaGlwcywgd2l0aCBvbmx5IDEwIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUuIDc5JSBvZiBvdXIgcGFydG5lcnMgKGNsdXN0ZXJlZCBhbG9uZyB0aGUgYm90dG9tIG9mIHRoZSBjaGFydCkgYXJlIHByZXNlbnQgaW4gNSBvciBsZXNzIHRvd25zaGlwcy4gSWYgdGhlIHJlc3BvbnNlIGlzIHRydWx5IG1lYW50IHRvIGJlIGNvdW50cnl3aWRlLCBpdCBpcyBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgd2hhdCB3b3VsZCBpbmNlbnRpdmlzZSBwYXJ0bmVycyB0byBleHBhbmQgdGhlaXIgZm9vdHByaW50cy4NCg0KYGBge3J9DQpwYXJ0bmVyX3NjYXR0ZXIgPC0gYmVuICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdGF0ZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIHRleHQgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSArICANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgDQojIGZvciBzb21lIHJlYXNvbiwgcmVtb3ZpbmcgdGhpcyBtZXNzZXMgd2l0aCB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbG90DQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlcikgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KICANCmBgYA0KDQojIyMgTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBhbmQgcGVvcGxlIGluIG5lZWQgYnkgc3RhdGUvcmVnaW9uDQoNCmBgYHtyfQ0KDQpiZW4gJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIGJ5ID0gInN0YXRlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gcGFydG5lcnMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXJ0bmVycyksIHNpemUgPSAyKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSArDQoNCnBpbiAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShQSU4gPSBzdW0odG90YWxfcGluKSkgJT4lIA0KICBtdXRhdGUoUElOID0gcm91bmQoUElOLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBQSU4gPSByZWNvZGUoUElOLCANCiAgICAgICAgICAgICAgICAgICAgICAnMCcgPSBOQV9yZWFsXykpICU+JQ0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBQSU4pLCBzaXplID0gMC4xKSArDQogIGdlb21fc2ZfdGV4dF9yZXBlbChhZXMobGFiZWwgPSBzY2FsZXM6OmNvbW1hKFBJTikpLCBzaXplID0gMS41KSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMpLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCg0KYGBgDQpUaGVyZSBhcmUgNTggY29tYmluYXRpb25zIGJldHdlZW4gcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVycywgMTkgb2Ygd2hpY2ggYXJlIGluc3RhbmNlcyB3aGVyZSB0aGUgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiBhbmQgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIGFuZCB0aGUgc2FtZSBvcmdhbmlzYXRpb247IG9uY2UgdGhlc2UgMTkgYXJlIGZpbHRlcmVkIG91dCwgYWxsIHRoZSByZW1haW5pbmcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmQgdG8ganVzdCAxMCByZXBvcnRpbmcgb3JnYW5pc2F0aW9uczoNCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIocmVwb3J0aW5nX29yZ2FuaXphdGlvbiAhPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgZ3JvdXBfYnkocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gJ051bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbicpDQogIA0KYGBgDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGltcGxtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCnZ1bG1tciAlPiUgDQogIHNlbGVjdChzdGF0ZSA9IHN0YXRlX3JlZ2lvbl9uYW1lLCBhZGp1c3RlZF9hcHByb3hpbWF0ZV92dWxuZXJhYmxlX3BvcHVsYXRpb24sIHRvdGFsX3BvcF9ib3RoX3NleGVzKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgIA0KICBkcm9wX25hKCkgJT4lDQogIHN1bW1hcmlzZSh2dWxuZXJhYmxlX3BvcCA9IHN1bShhZGp1c3RlZF9hcHByb3hpbWF0ZV92dWxuZXJhYmxlX3BvcHVsYXRpb24pLCANCiAgICAgICAgICAgIHRvdGFsX3BvcCA9IHN1bSh0b3RhbF9wb3BfYm90aF9zZXhlcykpICU+JSANCiAgbXV0YXRlKHZ1bG5lcmFibGVfcGMgPSB2dWxuZXJhYmxlX3BvcCAvIHRvdGFsX3BvcCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShzdGF0ZSkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKCFpcy5uYShiZW5lZmljaWFyaWVzKSwgYmVuZWZpY2lhcmllcywgMCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZ1bG5lcmFibGVfcG9wLCBiZW5lZmljaWFyaWVzKSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAwLjUpKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkZvb2Qgc2VjdXJpdHkgYmVuZWZpY2lhcmllcyAoNVdzKSBhbmQgdnVsbmVyYWJsZSBwb3B1bGF0aW9uIChNSU1VKSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCg0KIyMjIEJlbmVmaWNpYXJpZXMgDQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYmVuZWZpY2lhcnlfdHlwZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3RvdGFscyh3aGVyZSA9ICJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoZGVub21pbmF0b3IgPSAicm93IiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGBIb3N0L2xvY2FsIENvbW11bml0eWAsIGBJbnRlcm5hbGx5IERpc3BsYWNlZGAsIGBSZXR1cm5lZXNgLCBgUmFraGluZSBzdGF0ZWxlc3NgKSwgDQogICAgICAgICAgICAuZnVucyA9IGxpc3QofiAuICogMTAwKSkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gInN0YXRlIikgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgYnkgdHlwZSwgYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNClRoZSBzdGF0ZXMgYW5kIHN1Yi1yZWdpb25zIGluIHdoaWNoIHdlIGFyZSB3b3JraW5nIHRoZSBtb3N0IHdpdGggSURQcyBhcmUgQmFnbyAoRWFzdCksIEthY2hpbiwgQ2hpbiwgU2hhbiAoTm9ydGgpIGFuZCBLYXlhaC4gT3ZlcmFsbCwgNzUlIG9mIGJlbmVmaWNpYXJpZXMgYXJlIGZyb20gdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5LCAxNCUgYXJlIHN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBhbmQgMTElIGFyZSBJRFBzLiANCg0KYGBge3J9DQojIGNoZWNraW5nIHJlY3VycmVudCBiZW5lZmljaWFyaWVzIA0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcmllc19yZWN1cnJlbmN5LCBkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21fbGluZSgpICsNCiAgZmFjZXRfd3JhcCh+IGJlbmVmaWNpYXJpZXNfcmVjdXJyZW5jeSwgc2NhbGVzID0gImZyZWVfeSIpDQoNCmZzYyAlPiUgIA0KICBncm91cF9ieShiZW5lZmljaWFyaWVzX3JlY3VycmVuY3ksIGZyZXF1ZW5jeSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJPdGhlciIpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBmb3Igc29tZSByZWFzb24sIHRoZSBtdXRhdGUgZmN0X3Jlb3JkZXIgaXMgbm90IHdvcmtpbmcNCiANCmZzYyAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyeV90eXBlICE9ICJOQSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZCA9IGJlbmVmaWNpYXJpZXMgLyBob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYXZnX2hoZCksIHkgPSBhdmdfaGhkKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxNSkpICsNCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IHR5cGUiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiKQ0KDQpgYGANCg0KYGBge3J9DQpmc2MgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IHN0cl90cmltKGJlbmVmaWNpYXJ5X3R5cGUpLA0KICAgICAgICAgKGJlbmVmaWNpYXJ5X3R5cGUgPSBhcy5jaGFyYWN0ZXIoZmN0X3JlY29kZShiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICAgICJSYWtoaW5lIHN0YXRlbGVzcyIgPSAiTm9uLWRpc3BsYWNlZCBzdGF0ZWxlc3MgcGVvcGxlIGluIFJha2hpbmUiKSkpKSAlPiUNCiAgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgIT0gIk5BIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogDQogIG11dGF0ZShhdmdfaGhkX3NpemUgPSBiZW5lZmljaWFyaWVzIC8gaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSByZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGF2Z19oaGRfc2l6ZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcnlfdHlwZSwgeSA9IGF2Z19oaGRfc2l6ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMCkpICsNCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IHR5cGUiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiKQ0KDQpgYGANCg0K